// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 12.3.7
description: Argument list evalution for call expresions
info: |
    A tagged template is a function call where the arguments of the call are
    derived from a TemplateLiteral. The actual arguments include a template
    object and the values produced by evaluating the expressions embedded
    within the TemplateLiteral.
---*/

function Test() {
    var number = 5;
    var string = 'str';
    var object = {};
    function fn() { return 'result'; }
    var calls;

    calls = 0;
    (function() {
      return function() {
        calls++;
        assert.sameValue(
          arguments.length, 1, 'NoSubstitutionTemplate arguments length'
        );
      };
    })()`NoSubstitutionTemplate`;
    assert.sameValue(calls, 1, 'NoSubstitutionTemplate function invocation');

    calls = 0;
    (function() {
      return function(site, n, s, o, f, r) {
        calls++;
        assert.sameValue(n, number);
        assert.sameValue(s, string);
        assert.sameValue(o, object);
        assert.sameValue(f, fn);
        assert.sameValue(r, 'result');
        assert.sameValue(arguments.length, 6, 'TemplateHead arguments length');
      };
    })()`TemplateHead${number}TemplateSpans${string}${object}${fn}${fn()}`;
    assert.sameValue(calls, 1, 'TemplateHead function invocation');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
